#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

// Calcula a variancia
double variance(double *v, double mean, int n){
	int i;
	double sum = 0;
	for(i = 0; i < n; i++)
		sum += (v[i] - mean) * (v[i] - mean);
	return sum/n;
}

int main(int argc, char **argv){

	if(argc != 4)
		printf("usage: ./analysis <seq> ou <par> <n_inputs> <n_execs>");

	FILE *out, *time;
	char input[8];
	double times[atoi(argv[3])];
	int output;
	int i, j;

	// abre os arquivos das execucoes sequenciais
	if(!strcmp(argv[1], "seq")){
		out = fopen("outputs/seq.out", "r");
		if(out == NULL){
			printf("Falha ao abrir o arquivo outputs/seq.out.\n");
		}
		time = fopen("outputs/seq.times", "r");
		if(time == NULL){
			printf("Falha ao abrir o arquivo outputs/seq.times.\n");
		}
	}
	// abre os arquivos das execucoes paralelas
	else if(!strcmp(argv[1], "par")){
		out = fopen("outputs/par.out", "r");
		if(out == NULL){
			printf("Falha ao abrir o arquivo outputs/par.out.\n");
		}
		time = fopen("outputs/par.times", "r");
		if(time == NULL){
			printf("Falha ao abrir o arquivo outputs/par.times.\n");
		}
	}
	else
		return 1;
	
	// Para cada input
	for(i = 0; i < atoi(argv[2]); i++){

		// le o nome do arquivo de input
		fscanf(out, "%s", input);
		fscanf(time, "%s", input);

		// Para cada execucao, armazena-se o tempo
		double mean = 0;
		for(j = 0; j < atoi(argv[3]); j++){
			fscanf(out, "%d", &output);
			fscanf(time, "%lf", &times[j]);
			mean += times[j];
		}
		
		// estatisticas sobre os tempos de execucao (mean, stddev, confwidth)
		mean = mean/atoi(argv[3]);
		double stddev = sqrt(variance(times, mean, atoi(argv[3])));
		double confwidth = 1.96 * stddev/sqrt(atoi(argv[3]));
		double confmin = mean - confwidth;
		double confmax = mean + confwidth;
		
		// saida
		printf("%s\n", input);
		printf("\toutput: %d\n", output);
		printf("\tmean: %lf\n", mean);
		printf("\tstddev: %lf\n", stddev);
		printf("\tconfwidth: [%lf, %lf]\n", confmin, confmax);
	}

	// fecha arquivos
	fclose(out);
	fclose(time);

	return 0;
}
